热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

客体|抽象思维_注解深入浅出(三插桩)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了注解深入浅出(三插桩)相关的知识,希望对你有一定的参考价值。第二章注解深入浅出

篇首语:本文由编程笔记#小编为大家整理,主要介绍了注解深入浅出(三插桩)相关的知识,希望对你有一定的参考价值。



第二章注解深入浅出


  • 三、插桩
    • 3.1 什么是插桩
    • 3.2 字节码操作框架
    • 3.3 ASM 的使用



三、插桩

3.1 什么是插桩

QQ 空间曾经发布的《热修复解决方案》中利用 Javaassist 库实现向类的构造函数中插入一段代码解决 CLASS_ISPREVERIFIED 问题。包括了 Instant Run 的实现以及参照 Instant Run 实现的热修复美团 Robus 等都利用到了插桩技术。

插桩就是将一段代码插入或者替换原本的代码。字节码插桩顾名思义就是在我们编写的源码编译成字节码(Class)后,在 android 下生成 dex 之前修改 Class 文件,修改或者增强原有代码逻辑的操作。



我们需要查看方法执行耗时,如果每一个方法都需要自己手动去加入这些内容,当不需要时也需要一个个删去相应的代码。一个、两个方法还好,如果由 10 个、20 个得多麻烦!所以可以利用注解来标记需要插桩的方法,结合编译后操作字节码来帮助我们自动插入,当不需要时关掉插桩即可。这种 AOP 思想让我们只需关注插桩代码本身。

AOP:Aspect Oriented Programming,面向切面编程,通过预编译方式和运行期间动态代码实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

OOP:Object Oriented Programming,面向对象程序设计,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事务特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。


3.2 字节码操作框架

上面我们提到 QQ 空间使用了 Javaassist 来进行字节码插桩,除了 Javaassist 之外还有一个应用更为广泛的 ASM 框架同样也是字节码操作框架,Instant Run 包括 AspectJ 就是借助 ASM 来实现各自的功能。

我们非常熟悉的 JSON 格式数据是基于文本的,我们只需要知道它的规则就能够轻松的生成、修改 JSON 数据。同样的 Class 字节码也有其自己的规则(格式)。操作 JSON 可以借助 GSON 来非常方便的生成、修改 JSON 数据。而字节码 Class,同样可以借助 Javaassist/ASM 来实现对其修改。


字节码操作框架的作用在于生成或者修改 Class 文件,因此在 Android 中字节码框架本身是不需要打包进入 APK 的,只有其生成/修改之后的 Class 才需要打包进入 APK 中。它的工作时机在上图 Android 打包流程中的生成 Class 之后,打包 dex 之前。


3.3 ASM 的使用

ASM 可以直接从 jcenter() 仓库中引入,我们可以进入 https://bintray.com/ 进行搜索:


点击 图片第二个红框,可以看到最新的正式版本为:8.0.1


点击版本号查看引入:


所以,在 AS 中加入:

dependencies
testImplementation 'org.ow2.asm:asm:8.0.1'
testImplementation 'org.ow2.asm:asm-commons:8.0.1'

需要注意的是,使用 testImplementation 引入,这表示只能在 Java 的单元测试中使用这个框架,对 Android 中的依赖关系没有任何影响。

AS 中使用 gradle 的 Android 工程会自动创建 Java 单元测试与 Android 单元测试,测试代码分别在 test 与 androidTest。

详细的插桩细节参考以下两个文章:
关于java字节码框架ASM的学习
Java ASM 技术简介


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
author-avatar
手机用户2602931131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有